﻿#include "LogoScene.h"
#include "TitleScene.h"

LogoScene* LogoScene::create()
{
    LogoScene* ret = new LogoScene();
    if(ret && ret->init())
    {
        ret->autorelease();// 加入到自动释放池
    }else
    {
        delete ret;
        ret = nullptr;
    }
    
    return ret;
}

bool LogoScene::init()
{
    if(!Scene::init())
    {
        return false;
    }
    // 创建白色背景
    LayerColor* layerColor = LayerColor::create(Color4B::RED);
    this->addChild(layerColor);
    
    // 创建Logo图片背景
    Sprite* logo = Sprite::create("fslogo.png");
    logo->setPosition(Vec2(480,320));
    this->addChild(logo);

	//1.创建标题精灵
	Sprite* spTitle = Sprite::create("fm_title.png");
	//2.设置位置.默认位置在原点
	//spTitle->setPosition(Vec2(480, 320));
	//3.添加到场景
	this->addChild(spTitle);
	// 设置精灵的缩放值。形参：原始大小的倍率
	spTitle->setScale(2.0f);
	// 设置精灵的旋转角度。形参：角度，正值顺时针旋转，负值逆时针旋转
	//spTitle->setRotation(45);
	// 设置图片的锚点
	spTitle->setAnchorPoint(Vec2(0,0));
	// 设置颜色.color3B  取值范围0~255  -1：数据溢出
	spTitle->setColor(Color3B(-1, 0, 0));
	// 设置透明度.取值范围：0~255 0表示完全透明 255完全不透明
	spTitle->setOpacity(127);
	// 设置是否可见
	spTitle->setVisible(false);

	spTitle->getPosition();
	spTitle->getRotation();
	spTitle->getScale();
	spTitle->isVisible();

	//api:setXXX  getXXX  bool类型获取isXXX



	// 画云朵精灵
	Sprite* spCloud = Sprite::create("/hg_res/fm_clouid0.png");
	this->addChild(spCloud);
	spCloud->setPosition(Vec2(900,500));
	// 1.创建动作.花3秒从当前位置移动到目标位置
	MoveTo* moveTo = MoveTo::create(3.0f, Vec2(60, 500));
	// 花3秒从当前位置偏移了多少
	MoveBy* moveBy = MoveBy::create(3.0f, Vec2(-840, 0));
	// 2.执行动作
	//spCloud->runAction(moveTo);
	//spCloud->runAction(moveBy);
	
	// 先设置初始缩放值
	//spCloud->setScale(6.0f);
	// 1.创建缩放动作
	ScaleTo* scaleTo = ScaleTo::create(3.0f, 3.0f);
	// 2.目标对象执行动作
	//spCloud->runAction(scaleTo);
	ScaleBy* scaleBy = ScaleBy::create(3.0f, 3.0f);
	//spCloud->runAction(scaleBy);

	// 旋转
	RotateTo* rotateTo = RotateTo::create(3.0f, 360.0f);
	//spCloud->runAction(rotateTo);
	RotateBy* rotateBy = RotateBy::create(3.0f, 360.0f);
	//spCloud->runAction(rotateBy);

	// 跳跃
	JumpTo* jumpTo = JumpTo::create(3.0f, Vec2(60, 500), 100.0f, 3);
	//spCloud->runAction(jumpTo);

	// 着色变化
	TintTo* tintTo = TintTo::create(3.0f, Color3B(255, -1, 0));
	//spCloud->runAction(tintTo);

	// 淡入：透明度逐渐变化到255
	FadeIn* fadeIn = FadeIn::create(3.0f);
	// 淡出：透明度逐渐变化到0
	FadeOut* fadeOut = FadeOut::create(3.0f);
	// 淡到：透明度逐渐变化到指定数值
	FadeTo* fadeTo = FadeTo::create(3.0f, 127);
	//spCloud->runAction(fadeOut);

	// 闪烁
	Blink* blink = Blink::create(3.0f, 9);
	//spCloud->runAction(blink);

	// 移动、缩小、淡出
	MoveBy* moveByLeft =
		MoveBy::create(3.0f, Vec2(-840,0));
	ScaleTo* sacleToSmall = 
		ScaleTo::create(3.0f, 0.5f);
	FadeOut* fadeOutDie = 
		FadeOut::create(4.0f);
	// 并列动作：同时执行.参数：可变长参数表，参数任意个，（重点）以nullptr作为参数结束的标记
	// 执行时间：以最长的单动作执行时间为执行时长	
	Spawn* spawn = 
		Spawn::create(moveByLeft, sacleToSmall, fadeOutDie, nullptr);
	//spCloud->runAction(spawn);

	// 空动作,什么都不执行.思考：空动作是否可以放到并列动作中？
	DelayTime* dt1 = DelayTime::create(2.0f);
	DelayTime* dt2 = DelayTime::create(3.0f);
	// 移除自己：从场景中销毁.销毁后对象不可再访问
	RemoveSelf* removeSelf = RemoveSelf::create();
	// 序列动作：按序执行.参数：可变长参数表，参数任意个，（重点）以nullptr作为参数结束的标记
	// 执行时间是所有动作执行时间总和
	Sequence* sequence = 
		Sequence::create(moveByLeft, dt1, sacleToSmall, dt2, /*fadeOutDie,*/ removeSelf, nullptr);
	//spCloud->runAction(sequence);

	// 功能：一直旋转精灵
	RotateBy* rb_one = RotateBy::create(3.0f, 360.0f);
	// 创建循环动作。参数：要循环的动作；循环次数。
	Repeat* repeat = Repeat::create(rb_one, 2);
	RepeatForever* repeatForever = RepeatForever::create(rb_one);
	//spCloud->runAction(repeat);
	//spCloud->runAction(repeatForever);

	spCloud->runAction(
		RepeatForever::create(
		Sequence::create(
		MoveBy::create(3.0f, Vec2(-840, 0)),
		MoveBy::create(0, Vec2(840, 0)),
		nullptr)));

	// 1.创建帧动画
	Animation* animation = Animation::create();
	// 2.添加动画帧
	animation->addSpriteFrameWithFile("MsShadaoLeft_0.png");
	animation->addSpriteFrameWithFile("MsShadaoLeft_1.png");
	animation->addSpriteFrameWithFile("MsShadaoLeft_2.png");
	animation->addSpriteFrameWithFile("MsShadaoLeft_3.png");
	// 3.设置属性
	animation->setDelayPerUnit(0.12f);// 每个单元的延迟时间
	animation->setLoops(-1); // 设置动画循环次数
	// 4.创建帧动作
	Animate* animate = Animate::create(animation);
	// 5.创建精灵并执行动作
	Sprite* spMouse = Sprite::create();
	this->addChild(spMouse);
	spMouse->setPosition(Vec2(750, 320));
	//  放大
	spMouse->setScale(2.0f);
	//  翻转镜像
	spMouse->setFlippedX(true);  //对应动作：FlipX::create(true);

	spMouse->runAction(animate);

	// 作业：1.老鼠来回巡逻。2.烟囱。3.后宫主页


	// 2秒后自动切换到游戏标题场景
	// 调度器（闹钟：单次、自定义、默认）
	// 形参：匿名内部类[]:捕获外部变量的方式，（）形参表，｛｝函数体
	this->scheduleOnce([](float dt)
		{
			// 实现功能
			// 1.创建新的场景
			TitleScene* pScene = TitleScene::create();
			// 2.切换场景（导演--单例模式）
			Director::getInstance()->replaceScene(pScene);
		},
		2,
		"auto_replace");



    return true;
}
